package com.yf.ref;

public class FinalReferenceTest {
    static FinalReferenceTest ref;

    public static void main(String[] args) throws InterruptedException {
        ref = new FinalReferenceTest();
        ref = null;
        System.gc();
        // 因为Finalizer线程优先级很低，暂停1s
        Thread.sleep(1000);
        System.out.println(ref);
        /*
        在GC时，终结器引用入队。
        由Finalizer线程通过终结器引用找到被引用对象调用它的finalize()方法，第二次GC时才回收被引用的对象。
         */
        ref = null;
        System.gc();
        Thread.sleep(1000);
        System.out.println(ref);
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("终结器引用对象被复活了");
        ref = this;
        /*
        它用于实现对象的finalize()方法，也可以称为终结器引用。
        无需手动编码，其内部配合引用队列使用。
         */
    }
}
